#include <opencv2/core/hal/interface.h>

#include <iostream>
#include <opencv2/core/matx.hpp>
#include <opencv2/core/types.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/opencv.hpp>

#include "example.h"

int main() {
    cv::Mat image = cv::imread("../picture/apple.jpeg");
    int cols = image.cols;                           
    int rows = image.rows;                           
    cv::Mat image2;                                  
    cv::cvtColor(image, image2, cv::COLOR_RGB2HSV);  // 在图像处理中，先转化为hsv空间的image2

    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {  // 读取hsv参数并且转化为int类型。
            int h = image2.at<cv::Vec3b>(i, j)[0];
            int s = image2.at<cv::Vec3b>(i, j)[1];
            int v = image2.at<cv::Vec3b>(i, j)[2];
            // 红色范围：
            if ((h > 0 && h < 10 && s > 43 && h < 255 && v > 46 && v < 255) ||
                (h > 156 && h < 255 && s > 43 && s < 255 && v > 46 &&
                 v < 255)) {
                image2.at<cv::Vec3b>(i, j)[1] = 0;
                image2.at<cv::Vec3b>(i, j)[2] = 0;  // 赋值为黑色
            } else {
                image2.at<cv::Vec3b>(i, j)[1] = 0;
                image2.at<cv::Vec3b>(i, j)[2] = 1;  // 赋值为白色
            }
        }
    }

    cv::cvtColor(image2, image2, cv::COLOR_RGB2GRAY);  // 转灰度图

    blur(image2, image2, cv::Size(3, 3));  // 使用高斯滤波器，以平滑图像，滤除噪声。


    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            int pv = image2.at<uchar>(i, j);
            if (pv > 30) {
                image2.at<uchar>(i, j) = 255;
            } else {
                image2.at<uchar>(i, j) = 0;
            }
        }
    }
    // cv::imshow("二值化", image2);
    Canny(
        image2, image2, 200,
        75);  // canny算子边缘处理

    std::vector<cv::Vec3f> circles;
    HoughCircles(image2, circles, cv::HoughModes::HOUGH_GRADIENT, 50, 1000, 100,
                 100, 0, 250);  // 霍夫圆变换
    for (size_t i = 0; i < circles.size(); i++) {
        cv::Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
        int radius = cvRound(circles[i][2]);
        // 绘制圆心
        circle(image, center, 3, cv::Scalar(0, 255, 0), -1, 8, 0);
        // 绘制圆轮廓
        circle(image, center, radius, cv::Scalar(155, 50, 255), 3, 8, 0);
    }
    // cv::imshow("演示输出图像", image);
    //  如果不加waitkey,显示窗口一闪而过就结束了
    //  std::vector<std::vector<cv::Point>> contours;
    //   cv::findContours(red, contours, cv::RETR_EXTERNAL,
    //   cv::CHAIN_APPROX_SIMPLE);

    cv::imshow("演示输出图像", image);
    cv::waitKey(0);
}
